package com.jeegod.core.util;

import com.jeegod.core.base.Result;

/**
 * Result生成工具
 * <p>前端与服务器的每一次通讯都需要经过Results工具来生成Result对象，继而组装报文</p>
 *
 * @author 龚小龙
 * @version 1.0-20181215
 */
public class Results {
    /**
     * 受保护的构造函数，非本类和子类不可构造
     */
    protected Results() {
    }

    /**
     * 创建：空的Result对象
     *
     * @return Result对象
     */
    public static Result newResult() {
        return new Result();
    }

    /**
     * 创建：带成功失败标志的Result对象
     *
     * @param success 成功失败标志
     * @return Result对象
     */
    public static Result newResult(boolean success) {
        return new Result(success);
    }

    //
    // 业务调用成功
    // -----------------------------------------------------------------------------------------

    /**
     * 创建：代表成功的Result对象
     *
     * @return Result对象
     */
    public static Result success() {
        return new Result(true);
    }

    /**
     * 创建：代表成功且附带成功相关消息的Result对象
     *
     * @param msg 成功相关的消息
     * @return Result对象
     */
    public static Result success(String msg) {
        return new Result(true, null, msg);
    }

    /**
     * 创建：代表成功且附带编码以及成功相关消息的Result对象
     *
     * @param code 编码
     * @param msg  成功相关的消息
     * @return Result对象
     */
    public static Result success(String code, String msg) {
        return new Result(true, code, msg);
    }

    /**
     * 创建：代表成功且附带状态码的Result对象
     *
     * @param status 状态码
     * @return Result对象
     */
    public static Result successWithStatus(Integer status) {
        return new Result(true, status);
    }

    /**
     * 创建：代表成功且附带状态码和相关信息的Result对象
     *
     * @param status 状态码
     * @param msg    相关信息
     * @return Resut对象
     */
    public static Result successWithStatus(Integer status, String msg) {
        return new Result(true, status, null, msg);
    }

    /**
     * 创建：代表成功且附带相关数据的Result对象
     *
     * @param data 相关数据
     * @return Result对象
     */
    public static Result successWithData(Object data) {
        return new Result(true, null, null, data);
    }

    /**
     * 创建：代表成功且附带相关数据和相关信息的Result对象
     *
     * @param data 相关数据
     * @param msg  相关信息
     * @return Resut对象
     */
    public static Result successWithData(Object data, String msg) {
        return new Result(true, null, msg, data);
    }

    /**
     * 创建：代表成功且附带相关数据、编码和相关信息的Result对象
     *
     * @param data 相关数据
     * @param code 编码
     * @param msg  相关信息
     * @return Resut对象
     */
    public static Result successWithData(Object data, String code, String msg) {
        return new Result(true, code, msg, data);
    }

    //
    // 业务调用失败
    // -----------------------------------------------------------------------------------------

    /**
     * 创建：代表失败的Result对象
     *
     * @return Result对象
     */
    public static Result failure() {
        return new Result(false);
    }

    /**
     * 创建：代表失败且附带失败相关消息的Result对象
     *
     * @param msg 失败相关的消息
     * @return Result对象
     */
    public static Result failure(String msg) {
        return new Result(false, null, msg);
    }

    /**
     * 创建：代表失败且附带编码以及失败相关消息的Result对象
     *
     * @param code 编码
     * @param msg  失败相关的消息
     * @return Result对象
     */
    public static Result failure(String code, String msg) {
        return new Result(false, code, msg);
    }

    /**
     * 创建：代表失败且附带状态码的Result对象
     *
     * @param status 状态码
     * @return Result对象
     */
    public static Result failureWithStatus(Integer status) {
        return new Result(false, status);
    }

    /**
     * 创建：代表失败且附带状态码和相关信息的Result对象
     *
     * @param status 状态码
     * @param msg    相关信息
     * @return Resut对象
     */
    public static Result failureWithStatus(Integer status, String msg) {
        return new Result(false, status, null, msg);
    }

    /**
     * 创建：代表失败且附带相关数据的Result对象
     *
     * @param data 相关数据
     * @return Result对象
     */
    public static Result failureWithData(Object data) {
        return new Result(false, null, null, data);
    }

    /**
     * 创建：代表失败且附带相关数据和相关信息的Result对象
     *
     * @param data 相关数据
     * @param msg  相关信息
     * @return Resut对象
     */
    public static Result failureWithData(Object data, String msg) {
        return new Result(false, null, msg, data);
    }

    /**
     * 创建：代表失败且附带相关数据、编码和相关信息的Result对象
     *
     * @param data 相关数据
     * @param code 编码
     * @param msg  相关信息
     * @return Resut对象
     */
    public static Result failureWithData(Object data, String code, String msg) {
        return new Result(false, code, msg, data);
    }

}
